package cn.edu.hnu.matching.common;

import lombok.Data;

import java.io.Serializable;

/**
 * 通用返回类
 *
 * @author n70huihui
 * @since 2025-04-10
 */
@Data
public class Result<T> implements Serializable {

    /**
     * 状态码
     */
    private int code;

    /**
     * 载荷数据
     */
    private T data;

    /**
     * 提示信息
     */
    private String message;

    private Result(int code, T data, String message) {
        this.code = code;
        this.data = data;
        this.message = message;
    }

    /**
     * 成功
     * @param data 载荷数据
     * @return 状态为成功的 Result
     * @param <E> 载荷数据类型
     */
    public static <E> Result<E> success(E data) {
        return new Result<>(ResultCode.SUCCESS.getCode(), data, ResultCode.SUCCESS.getMessage());
    }

    /**
     * 失败
     * @param message 提示信息
     * @return 状态为失败的 Result，错误码为 500，提示信息为 <code>message</code>
     */
    public static Result<Void> error(String message) {
        return new Result<>(ResultCode.SYSTEM_ERROR.getCode(), null, message);
    }

    /**
     * 失败
     * @param resultCode 状态码
     * @return 状态为失败的 Result
     * <p>错误码为 <code>resultCode.code</code>，提示信息为 <code>resultCode.message</code>
     */
    public static Result<Void> error(ResultCode resultCode) {
        return new Result<>(resultCode.getCode(), null, resultCode.getMessage());
    }

    /**
     * 失败
     * @param resultCode 状态码
     * @param message 提示信息
     * @return 状态为失败的 Result
     * <p>错误码为 <code>resultCode.code</code>，提示信息为 <code>message</code>
     */
    public static Result<Void> error(ResultCode resultCode, String message) {
        return new Result<>(resultCode.getCode(), null, message);
    }

    /**
     * 自定义 Result
     * @param code 自定义状态码
     * @param message 自定义提示信息
     * @return 状态自定义的 Result
     */
    public static Result<Void> customize(int code, String message) {
        return new Result<>(code, null, message);
    }
}